package cn.uway.dao.impl;

import java.util.List;

import org.apache.ibatis.session.RowBounds;
import org.mybatis.spring.SqlSessionTemplate;
import org.mybatis.spring.support.SqlSessionDaoSupport;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;

import cn.uway.dao.IBaseDao;
import cn.uway.pojo.common.PageInfo;

/**
 * @author lyr
 * @category 默认数据访问对象接口展现
 * @version 0.0.1
 * @date 2016/1/3
 */

@Repository
public class BaseDaoImpl<T> extends SqlSessionDaoSupport implements IBaseDao<T> {
	
	@Autowired
    public void setSqlSessionTemplate(SqlSessionTemplate sqlSessionTemplate) {
        super.setSqlSessionTemplate(sqlSessionTemplate);
    }
	
	
	/**
	 * 保存
	 * 
	 * @param sqlName
	 *            SQL语句ID
	 * @param parames
	 *            SQL语句参数
	 */
	public int save(String sqlName, Object parames) {
		return getSqlSession().insert(sqlName, parames);
	}

	/**
	 * 更新
	 * 
	 * @param sqlName
	 *            SQL语句ID
	 * @param paramList
	 *            SQL语句参数
	 */
	
	public int update(String sqlName) {
		return getSqlSession().update(sqlName);
	}
	
	public int update(String sqlName, Object parames) {
		return getSqlSession().update(sqlName, parames);
	}

	/**
	 * 删除
	 * 
	 * @param sqlName
	 *            SQL语句ID
	 * @param id
	 *            SQL语句参数
	 */
	public int delete(String sqlName) {
		return getSqlSession().delete(sqlName);
	}
	
	public int delete(String sqlName, Object parames) {
		return getSqlSession().delete(sqlName, parames);
	}

	/**
	 * 查询单条记录
	 * 
	 * @param sqlName
	 *            SQL语句ID
	 * @return 查询结果
	 */
	public T selectOne(String sqlName) {
		return getSqlSession().selectOne(sqlName);
	}

	/**
	 * 查询单条记录
	 * 
	 * @param sqlName
	 *            SQL语句ID
	 * @param params
	 *            SQL语句参数
	 * @return 查询结果
	 */
	public T selectOne(String sqlName, Object params) {
		return getSqlSession().selectOne(sqlName, params);
	}

	/**
	 * 查询多条记录
	 * 
	 * @param sqlName
	 *            SQL语句ID
	 * @return 查询结果
	 */
	public List<T> selectList(String sqlName) {
		return getSqlSession().selectList(sqlName);
	}

	/**
	 * 查询多条记录
	 * 
	 * @param sqlName
	 *            SQL语句ID
	 * @param params
	 *            SQL语句参数
	 * @return 查询结果
	 */
	public List<T> selectList(String sqlName, Object params) {
		return getSqlSession().selectList(sqlName, params);
	}
	
	
	/**
	 * 查询记录数
	 * 
	 * @param sqlName
	 *            SQL语句ID
	 * @param params
	 *            SQL语句参数
	 * @return 查询结果
	 */
	public int selectCount(String sqlName, Object params) {
		return (Integer) getSqlSession().selectOne(sqlName, params);
	}

	/**
	 * 分页查询
	 * @param countKey
	 *            查询该表所有记录行的SQL语句ID
	 * @param sqlKey
	 *            需要查询记录的SQL语句ID
	 * @param param
	 *            传递给查询语句的参数
	 * @param pageNo
	 *            页数
	 * @param pageSize
	 *            每页记录数
	 * @return 查询结果
	 */
	public PageInfo pageQuery(String countKey, String sqlKey, Object param, Integer pageNo, Integer pageSize) {
		int skipResults = PageInfo.getStartOfPage(pageNo, pageSize);
		int totalSize = (Integer) getSqlSession().selectOne(countKey, param);
		
		while(totalSize >0 && totalSize <= skipResults){
			skipResults= skipResults - pageSize;
			pageNo = pageNo -1;
		}
		List<Object> data = getSqlSession().selectList(sqlKey, param, new RowBounds(skipResults, pageSize));
		return new PageInfo(totalSize, data);
	}

}
